package generate

// Define a code generation template
const (
	modelTemplate = `package model

var {{.PrivateName}}Struct = sqlbuilder.NewStruct(new({{.ModelName}}Model))

type {{.ModelName}}Model struct {
	{{range getColumns .}}
	{{.ModelName}} {{.ModelType}} {{.ModelTag}} {{.ModelComment}}{{end}}
}

func (m *{{.ModelName}}Model) TableName() string {
	return "{{.Name}}"
}

// UpdateById 根据主键id更新
func (m *{{.ModelName}}Model) UpdateById() error {
	{{range getColumns .}}{{if isPrimaryKey .Key}}if !m.{{.ModelName}}.Valid{
		return utils.ParamError
	}{{end}}{{end}}
	update := sqlbuilder.Update(m.TableName())

	setString := make([]string, 0, 1)
	
	{{range getColumns .}}{{if isPrimaryKey .Key}}{{else}}
	if m.{{.ModelName}}.Valid {
		setString = append(setString, update.Assign("{{.Name}}", m.{{.ModelName}}))
	}{{end}}{{end}}

	// 没有需要修改的参数 那就不用修改了 表示修改成功
	if len(setString) == 0 {
		return nil
	}
	update.Set(setString...)
	{{range getColumns .}}{{if isPrimaryKey .Key}}
	update.Where(update.Equal("{{.Name}}", m.{{.ModelName}}))
	{{end}}{{end}}
	
	updateSql, args := update.Build()

	if log.IsDebug() {
		log.Debugf("{{.ModelName}}Model.UpdateById.sql:\n\t%s\n\t\targs:%+v", updateSql, args)
	}

	_, err := writeMysqlClient.Exec(updateSql, args...)
	if err != nil {
		log.Error(err)
		return err
	}
	return nil
}

// DeleteById 根据id删除
func (m *{{.ModelName}}Model) DeleteById(id any) error {
	sb := sqlbuilder.DeleteFrom(m.TableName())
	{{range getColumns .}}{{if isPrimaryKey .Key}}
	sb.Where(sb.Equal("{{.Name}}", id))
	{{end}}{{end}}
	deleteSql, args := sb.Build()

	if log.IsDebug() {
		log.Debugf("{{.ModelName}}Model.DeleteById.sql:\n\t%s\n\t\targs:%+v", deleteSql, args)
	}

	_, err := writeMysqlClient.Exec(deleteSql, args...)
	if err != nil {
		log.Error(err)
		return err
	}

	return nil
}

// AddOne 添加一条信息
func (m *{{.ModelName}}Model) AddOne() error {
	sb := sqlbuilder.InsertInto(m.TableName())
	var cols []string
	var values []any

	{{range getColumns .}}{{if isPrimaryKey .Key}}{{else}}
	if m.{{.ModelName}}.Valid {
		cols = append(cols, "{{.Name}}")
		values = append(values, m.{{.ModelName}})
	}{{end}}{{end}}
	sb.Cols(cols...)
	sb.Values(values...)

	addSql, args := sb.Build()

	if log.IsDebug() {
		log.Debugf("{{.ModelName}}Model.AddOne.sql:\n\t%s\n\t\targs:%+v", addSql, args)
	}

	_, err := writeMysqlClient.Exec(addSql, args...)
	if err != nil {
		log.Error(err)
		return err
	}
	return nil
}

// PageList 分页查询微信aiHelp列表 暂时没有查询条件
func (m *{{.ModelName}}Model) PageList(param *dto.{{.ModelName}}SelectDTO) (*utils.PageUtils, error) {
	sf := {{.PrivateName}}Struct.SelectFrom(m.TableName())
	aSql,args := sf.Build()

	// 创建分页工具
	pageUtils := &utils.PageUtils{PageNumber: param.PageNumber, PageSize: param.PageSize,
		DB: readMysqlClient.DB, Sql: &aSql, Args: args}

	err := pageUtils.PageExec(func(rows *sql.Rows) (any, error) {
		res := make([]*{{.ModelName}}Model, 0, 10)
		for rows.Next() {
			wx := &{{.ModelName}}Model{}
			err := wx.readRow(rows)
			if err != nil {
				log.Error(err)
				return nil, err
			}
			res = append(res, wx)
		}
		return res, nil
	})
	if err != nil {
		log.Error(err)
		return nil, err
	}
	return pageUtils, nil
}

func (m *{{.ModelName}}Model) readRow(rows *sql.Rows) error {
	err := rows.Scan({{.PrivateName}}Struct.Addr(m)...)
	if err != nil {
		return err
	}
	return nil
}
`
)
